using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using FEL.BOD;
using FEL.COM;
using System.Collections.Generic;
using Koala.KoalaWebControls;

public partial class COM_SERVICIOS_COM_GRUPO : PaginaBaseTreeGrid
{
    protected override Type TipoObjeto
    {
        get { return typeof(Com_Grupo); }
    }

    protected override TreeView Trv
    {
        get { return trvArtGrupo; }
    }

    protected override FormView Frv
    {
        get { return frvarticulo_com_grupo; }
    }

    protected override ObjectDataSource OdsFrv
    {
        get { return odsfrvActivos_com_grupo; }
    }

    protected override Button ResponderZoom
    {
        get { return Seleccionar; }
    }

    protected override Button RegresoZoom
    {
        get { return Atras; }
    }

    protected override KFiltro Filtro
    {
        get { return null; }
    }

    protected override string Contenedor
    {
        get { return "SERVICIOS_COM_GRUPO"; }
    }

    private int NivelActivoActual
    {
        get
        {
            object o = ViewState["NivelActivoActual"];
            return (o == null) ? 0 : (int)o;

        }
        set
        {
            ViewState["NivelActivoActual"] = value;
        }
    }
    
    
    protected void Page_Load(object sender, EventArgs e)
    {
        odsfrvActivos_com_grupo.Inserted += new ObjectDataSourceStatusEventHandler(odsfrvActivos_com_grupo_Inserted);
        odsfrvActivos_com_grupo.Deleted += new ObjectDataSourceStatusEventHandler(odsfrvActivos_com_grupo_Deleted);
        odsfrvActivos_com_grupo.Updated += new ObjectDataSourceStatusEventHandler(odsfrvActivos_com_grupo_Updated);

        frvarticulo_com_grupo.DataBound += new EventHandler(frvarticulo_com_grupo_DataBound);
        frvarticulo_com_grupo.ModeChanging += new FormViewModeEventHandler(frvarticulo_com_grupo_ModeChanging);
        trvArtGrupo.SelectedNodeChanged += new EventHandler(trvArtGrupo_SelectedNodeChanged);        

        base.Page_Load(sender, e);

        if (!IsPostBack)
        {
            ActualizarDatos();
            BloquearFrv();
        }

        if (_habilitarFrv)
        {
            ExpandirPath(Trv, _pathNodoZoom, true);
        }
        lblMensaje.DataBind();
    }

    private const int _nivelOperativo = 2;
    // nivel operativo se centa desde el nivel 0
    private int NivelOperativo
    {
        get
        {
            return _nivelOperativo;
        }
    }

    void BloquearFrv()
    {
        Frv.Enabled = false;
    }

    void frvarticulo_com_grupo_DataBound(object sender, EventArgs e)
    {
        TextBox prueba = ((TextBox)Frv.FindControl("Com_Grupo_Id"));

        if (frvarticulo_com_grupo.CurrentMode == FormViewMode.ReadOnly)
        {
            if (frvarticulo_com_grupo.DataKey["Com_Grupo_Id"] == null)
                DeshabilitarBoton("DeleteButton");
        }

        if (frvarticulo_com_grupo.CurrentMode == FormViewMode.Insert)
        {
            TextBox _valorTipo = (TextBox)Frv.FindControl("Tipo");
            _valorTipo.Text = "SER";            
        }

        if (Frv.CurrentMode == FormViewMode.ReadOnly)
        {
            if (NivelActivoActual < NivelOperativo)
                HabilitarBoton("NewButton");

            else
                DeshabilitarBoton("NewButton");
        }
    }

    protected override void Trv_SelectedNodeChanged(object sender, EventArgs e)
    {
        if (Zoom.ContieneRequerimientoDestino(UbicacionUrl) &&
            Zoom.ObtenerModoDeRequerimiento(Zoom.ObtenerRutaOrigen(UbicacionUrl)) != FormViewMode.ReadOnly
            && ((TreeView)sender).SelectedNode.Depth == NivelOperativo)
        {
            ResponderZoom.Visible = true;
        }
        else
        {
            ResponderZoom.Visible = false;
        }

        Frv.ChangeMode(FormViewMode.ReadOnly);
        AsignarParametrosDataSourceDeatailsView(Trv.SelectedValue.ToString());
    }


   /* void DeshabilitarBoton1(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = false;
    }*/


    void DeshabilitarBoton(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = false;
    }

    void HabilitarBoton(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = true;
    }

    void odsfrvActivos_com_grupo_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvArtGrupoValuePath"] != null)
                valuePath = ViewState["trvArtGrupoValuePath"].ToString();

            ActualizarDatos();

            string nuevoNodo = e.ReturnValue.ToString();

            if (valuePath != null)
                ExpandirPath(trvArtGrupo, valuePath + trvArtGrupo.PathSeparator + nuevoNodo, true);

            NivelActivoActual = trvArtGrupo.SelectedNode.Depth;

            ViewState["trvArtGrupoValuePath"] = trvArtGrupo.SelectedNode.ValuePath;
        }
    }

    void ActualizarDatos()
    {
        trvArtGrupo.Nodes.Clear();
        List<Com_Grupo> lstMetaLista = ObtenerMetadatosArbol((Scope)Session["Scope"]);
        ArmarArbol(trvArtGrupo.Nodes, lstMetaLista, null);
    }

    void odsfrvActivos_com_grupo_Deleted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvArtGrupoValuePath"] != null)
                valuePath = ViewState["trvArtGrupoValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                //int NivelActivoActual = ;
                valuePath = valuePath.Remove(valuePath.LastIndexOf(trvArtGrupo.PathSeparator));
                ActualizarDatos();
                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvArtGrupo, valuePath, false);//exapande arbol
                }

            }

            ViewState["trvArtGrupoValuePath"] = null;
            BloquearFrv();
            //udpTrv.Update();
        }
    }

    void odsfrvActivos_com_grupo_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvArtGrupoValuePath"] != null)
                valuePath = ViewState["trvArtGrupoValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                ActualizarDatos();

                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvArtGrupo, valuePath, true);
                }
            }
            ViewState["trvArtGrupoValuePath"] = trvArtGrupo.SelectedNode.ValuePath;
            udpTrv.Update();
        }
    }

    void trvArtGrupo_SelectedNodeChanged(object sender, EventArgs e)
    {
        ViewState["trvArtGrupoValuePath"] = trvArtGrupo.SelectedNode.ValuePath;
        Frv.Enabled = true;
        NivelActivoActual = trvArtGrupo.SelectedNode.Depth;
    }

        void frvarticulo_com_grupo_ModeChanging(object sender, FormViewModeEventArgs e)
    {
        if (frvarticulo_com_grupo.CurrentMode == FormViewMode.ReadOnly &&
            e.NewMode == FormViewMode.Insert)
        {
            _id = ObtenerText("Id");
            _codigo = ObtenerText("Codigo");
            _nombre = ObtenerText("Nombre");
        }
    }

    private string _id = string.Empty;
    private string _nombre = string.Empty;
    private string _codigo = string.Empty;

    protected override void DefinirParametrosFijosDeInsercion(List<DictionaryEntry> param)
    {
        if (!string.IsNullOrEmpty(_id))
        {
            param.Add(new DictionaryEntry("Com_Grupo_Id", _id));
            param.Add(new DictionaryEntry("Com_Grupo_codigo", _codigo));
            param.Add(new DictionaryEntry("Com_Grupo_Nombre", _nombre));
        }
    }

    string ObtenerText(string idTextBox)
    {
        return ((TextBox)Frv.FindControl(idTextBox)).Text;
    }

    void ExpandirPath(TreeNodeCollection raiz, string valuePath, string nuevoNodoId)
    {
        string nuevoPath = null;
        if (string.IsNullOrEmpty(nuevoNodoId))
            nuevoPath = valuePath;
        else
            nuevoPath = valuePath + trvArtGrupo.PathSeparator + nuevoNodoId;

        TreeNode nuevoNodo = trvArtGrupo.FindNode(nuevoPath);
        nuevoNodo.Select();

        while (nuevoNodo.Parent != null)
        {
            nuevoNodo = nuevoNodo.Parent;
            nuevoNodo.Expand();
        }
    }

    void ExpandirPath(TreeView trv, string valuePath, bool selecionarUltimoNodo)
    {
        TreeNode nodo = trv.FindNode(valuePath);
        if (selecionarUltimoNodo)
            nodo.Select();
        while (nodo != null)
        {
            nodo.Expand();
            nodo = nodo.Parent;
        }
    }

    TreeNode BuscarNodo(TreeNodeCollection nodos, string indiceNodo)
    {
        for (int i = 0; i < nodos.Count; i++)
        {
            if (nodos[i].Value == indiceNodo)
                return nodos[i];
        }
        return null;
    }

    private List<Com_Grupo> ObtenerMetadatosArbol(Scope s)
    {
        BO_Com_Grupo boComGrupo = new BO_Com_Grupo();
        //Scope s = (Scope)Session["Scope"];


        List<Com_Grupo> lstComGrupo = null;
        try
        {
            lstComGrupo = boComGrupo.GetByServicios("Nombre", s, s.Int_Empresa_Id);
        }
        catch
        {

        }
        return lstComGrupo;
    }

    private void ArmarArbol(TreeNodeCollection raiz, List<Com_Grupo> lstArbolMetaDatos, string IdPadre)
    {
        
        List<Com_Grupo> nuevosNodos = SacarHijos(IdPadre, lstArbolMetaDatos);
        for (int indiceNuevo = 0; indiceNuevo < nuevosNodos.Count; indiceNuevo++)
        {
            TreeNode nuevoNodo = AgregarNodo(nuevosNodos[indiceNuevo], raiz);
            ArmarArbol(nuevoNodo.ChildNodes, lstArbolMetaDatos, nuevosNodos[indiceNuevo].Id);
        }
    }

    private TreeNode AgregarNodo(Com_Grupo metaNodoHijo, TreeNodeCollection raizNodo)
    {
        TreeNode nodoHijo = new TreeNode(metaNodoHijo.Nombre, metaNodoHijo.Id);
        nodoHijo.SelectAction = TreeNodeSelectAction.Select;
        nodoHijo.PopulateOnDemand = false;
        raizNodo.Add(nodoHijo);
        if (_idNodoZoom == metaNodoHijo.Id)
            _pathNodoZoom = nodoHijo.ValuePath;
        return nodoHijo;
    }

    private string _pathNodoZoom;

    private List<Com_Grupo> SacarHijos(string padreId, List<Com_Grupo> lstMetadatos)
    {
        List<Com_Grupo> lstHijosObtenidos = new List<Com_Grupo>();
        for (int indice = 0; indice < lstMetadatos.Count; indice++)
        {
            if (lstMetadatos[indice].Com_Grupo_Id == padreId)
            {
                lstHijosObtenidos.Add(lstMetadatos[indice]);
                lstMetadatos.RemoveAt(indice);
                indice--;
            }
        }
        return lstHijosObtenidos;
    }  

}
